#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
using namespace std;

void test()
{
    int num = 0;
    while (true)
    {
        cout << "num:" << num << endl;
        num++;
        sleep(1);
    }
}
void test2()
{
}
char arr[100];
int size = 0;

void signaled(int i)
{
    cout << "666" << endl;
    sleep(1);
}

void PrintPendingmap(sigset_t &ped)
{
    cout << "进程id:" << getpid() << " Pendinglist:";
    for (int i = 31; i > 0; i--)
    {
        if (sigismember(&ped, i))
        {
            cout << 1;
        }
        else
        {
            cout << 0;
        }
    }
    cout << endl;
}

// int main()
// {
//     //注册信号
//     signal(2,signaled);
//     //給两个表一个，一个用来设置，一个用来保存久的表
//     sigset_t block, oblock;
//     //将两个表置空
//     sigemptyset(&block);
//     sigemptyset(&oblock);
//     //设置要阻塞的信号
//     sigaddset(&block, 2);
//     //设置新表，保存旧表
//     sigprocmask(SIG_SETMASK, &block, &oblock);

//     int cnt=10;
//     while (1)
//     {
//         cnt--;
//         // 当cnt等于0时删除阻塞，就是就将旧表重新设置，不保存旧表
//         if(cnt==0)
//         sigprocmask(SIG_SETMASK, &oblock, nullptr);
//         //获取pending表并打印对应的位图
//         sigset_t m;
//         sigpending(&m);
//         PrintPendingmap(m);
//         sleep(1);
//     }
//     return 0;
// }

// int main()
// {
//     int id=fork();
//     if(id==0)
//     {
//         int a=10/0;
//         exit(1);
//     }
//     else
//     {
//         int statu=0;
//         waitpid(id,&statu,0);
//         printf("core dump: %d \n",(statu>>7)&1);
//     }
//     return 0;
// }

// int main()
// {
//     int arr[2]={0};
//     int getpipe=pipe(arr);
//     if(getpipe==-1)
//     {
//         perror("pipe :");
//     }
//     pid_t id=fork();
//     if(id==0)
//     {
//         int cout=1;
//         close(arr[1]);
//         while(1)
//         {
//             char buff[1024];
//             int size=read(arr[0],buff,9);
//             buff[size]=0;
//             printf("%s",buff);
//             printf(" %d\n",cout++);
//         }
//     }
//     else
//     {
//         int count=1;
//         close(arr[0]);
//         while(1)
//         {
//             char str[9];
//             sprintf(str,"zgwnbb %d",count++);
//             write(arr[1],str,9);
//             sleep(1);
//         }
//     }
//     return 0;
// }

// 2024//11/6
// int main()
// {
//     int arr[2] = {0};
//     int get = pipe(arr);
//     if (get == -1)
//     {
//         cout << "创建管道失败" << endl;
//     }
//     pid_t id = fork();
//     if (id == 0)
//     {
//         close(arr[1]);
//         char red[15];
//         while (1)
//         {
//             int n = read(arr[0], red, sizeof(red));
//             cout <<"子进程读:"<<red << endl;    
//             if(n==0)
//             break;
//         }
//         exit(1);
//     }
//     close(arr[0]);
//     while(1)
//     {
//         write(arr[1],"i am father",sizeof("i am father"));
//         sleep(1);
//     }
//     return 0;
// }

void PrintBlock()
{

    cout<<"Blocklsit:";
    sigset_t blk,oblk;
    sigisemptyset(&blk);
    sigisemptyset(&oblk);
    sigprocmask(SIG_SETMASK,&blk,&oblk);
    for(int i=31;i>0;i--)
    {
        if(sigismember(&oblk,i))
            cout<<1;
        else 
            cout<<0;
    }
    cout<<endl;
}


void PrintPending()
{
    cout<<"peding list:";
    sigset_t sig;
    sigpending(&sig);
    for(int i =31;i>0;i--)
    {
        if(sigismember(&sig,i))
            cout<<1;
        else 
            cout<<0;
    }
    cout<<endl;
}

void function(int i)
{
    static int a=1;
    a++;
    while(1)
    {
        cout<<a<<endl;
        break;
    }
}


//观察pending表，型号允许串型执行吗
// int main()
// {
//     struct sigaction act,oact;
//     act.sa_handler=function;
//     sigaction(2,&act,&oact);

//     PrintPending();
//     raise(2);
//     PrintPending();

//     return 0;
// }




// void func(int i)
// {
//     cout<<"信号值为:"<<i<<endl;
// }

// int main()
// {
//     struct sigaction act ,oact;
//     act.sa_handler=func;
//     sigaction(2,&act,&oact);
//     raise(2);
//     return 0;
// }



int main()
{
    sigset_t sig,osig;
    sigemptyset(&sig);
    sigemptyset(&osig);

    sigaddset(&sig, 2);
    sigaddset(&sig, 40);

    sigprocmask(SIG_SETMASK, &sig, &osig);

    for(int i=1;i<=5;i++)
    {
        raise(2);
        raise(40);
        cout<<"已经发送信号"<<i<<"次"<<endl;
        sleep(1);
    }


    return 0;
}